﻿using Microsoft.VisualBasic.FileIO;
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web;
using System.Web.Optimization;
using Volga_It.Hotels.Properties;
namespace Volga_It.Hotels
{
    public class BundleConfig
    {
        // Дополнительные сведения о Bundling см. по адресу http://go.microsoft.com/fwlink/?LinkId=254725
        public static void RegisterBundles(BundleCollection bundles)
        {
            bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));

            bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
                        "~/Scripts/jquery-ui-{version}.js"));

            bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                        "~/Scripts/jquery.unobtrusive*",
                        "~/Scripts/jquery.validate*"));

            // Используйте версию Modernizr для разработчиков, чтобы учиться работать. Когда вы будете готовы перейти к работе,
            // используйте средство построения на сайте http://modernizr.com, чтобы выбрать только нужные тесты.
            bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                        "~/Scripts/modernizr-*"));

            bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css"));

            bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
                        "~/Content/themes/base/jquery.ui.core.css",
                        "~/Content/themes/base/jquery.ui.resizable.css",
                        "~/Content/themes/base/jquery.ui.selectable.css",
                        "~/Content/themes/base/jquery.ui.accordion.css",
                        "~/Content/themes/base/jquery.ui.autocomplete.css",
                        "~/Content/themes/base/jquery.ui.button.css",
                        "~/Content/themes/base/jquery.ui.dialog.css",
                        "~/Content/themes/base/jquery.ui.slider.css",
                        "~/Content/themes/base/jquery.ui.tabs.css",
                        "~/Content/themes/base/jquery.ui.datepicker.css",
                        "~/Content/themes/base/jquery.ui.progressbar.css",
                        "~/Content/themes/base/jquery.ui.theme.css"));

            // Очистка таблиц перед загрузкой данных (для сохранения ссылок ключей)
            FlushTable("RoomsPrices");
            FlushTable("Rooms");
            FlushTable("HotelsReviews");
            FlushTable("Hotels");
            
            // Заполнение БД из CSV Файлов
            FillTable("RoomsPrices", Settings.Default.RoomsPricesDataPath);
            FillTable("Rooms", Settings.Default.RoomsDataPath);            
            FillTable("Hotels", Settings.Default.HotelsDataPath);
            FillTable("HotelsReviews", Settings.Default.HotelsReviewsPath);
        }
        /// <summary>
        /// Метод очистки таблиц перед заполнением
        /// </summary>
        /// <param name="TableName">Имя таблицы, которую нужно очистить</param>
        private static void FlushTable(string TableName)
        {
            using (SqlConnection connection = new SqlConnection(Settings.Default.DBConnectionString))
            {
                connection.Open();
                using (SqlTransaction trans = connection.BeginTransaction(IsolationLevel.ReadUncommitted))
                {
                    using (SqlBulkCopy bulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, trans))
                    {
                        SqlCommand cmd = new SqlCommand("DELETE FROM " + TableName, connection, trans);
                        cmd.ExecuteNonQuery();
                    }
                    trans.Commit(); 
                }                
            }
        }
        /// <summary>
        /// Метод заполнения таблицы данными из CSV-файла
        /// </summary>
        /// <param name="TableName">Имя таблицы в БД, которую нужно заполнить</param>
        /// <param name="CsvDataPath">Путь до CSV-файла, данные из которого нужно взять</param>
        private static void FillTable(string TableName, string CsvDataPath)
        {            
            DataTable csvFileData = GetDataTabletFromCSVFile(CsvDataPath);
            using (SqlConnection connection = new SqlConnection(Settings.Default.DBConnectionString))
            {
                connection.Open();                
                using (SqlTransaction trans = connection.BeginTransaction(IsolationLevel.ReadUncommitted))
                {
                    using (SqlBulkCopy bulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, trans))
                    {                        
                        // Заполнение таблицы из файла
                        bulk.DestinationTableName = TableName;
                        foreach (DataColumn column in csvFileData.Columns)
                            bulk.ColumnMappings.Add(column.ToString(), column.ToString());
                        bulk.WriteToServer(csvFileData);
                    }
                    trans.Commit();
                }
                connection.Close();
            }
        }
        /// <summary>
        /// Метод загрузки данных из CSV-файлов для таблиц
        /// </summary>
        /// <param name="csv_file_path">Директория и имя файла в данном проекте (файл ищется только в пути этого проекта)</param>
        /// <returns>Экземпляр DataTable</returns>
        private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
        {
            if (File.Exists(HttpRuntime.AppDomainAppPath + csv_file_path) == false)
                throw new FileNotFoundException("Не найден CSV-файл с данными по пути: " + HttpRuntime.AppDomainAppPath + csv_file_path);
            DataTable csvData = new DataTable();            
            using(TextFieldParser csvReader = new TextFieldParser(HttpRuntime.AppDomainAppPath + csv_file_path))
            {
                csvReader.SetDelimiters(new string[] { ";" });
                csvReader.HasFieldsEnclosedInQuotes = true;
                string[] colFields = csvReader.ReadFields();
                // Загружаем имена столбцов из файла
                foreach (string column in colFields)
                {
                    DataColumn datecolumn = new DataColumn(column);
                    datecolumn.AllowDBNull = true;
                    csvData.Columns.Add(datecolumn);
                }
                // Загружаем строки из файла
                while (!csvReader.EndOfData)
                {
                    string[] fieldData = csvReader.ReadFields();
                    //Making empty value as null
                    for (int i = 0; i < fieldData.Length; i++)                        
                        if (fieldData[i] == "") fieldData[i] = null;                                                    
                    csvData.Rows.Add(fieldData);
                }
            }            
            return csvData;
        }
    }
}